package java大项目.a2拼图游戏.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //创建二维数组,目的是用来管理数据，加载图片的时候，会根据二维数组的数据来加载
    int[][]data=new int[4][4];

    //定义俩个xy用来记录0的位置
    int x=0;
    int y=0;

    //定义一个变量，记录当前展示图片的路径
    String path="src\\java大项目\\a2拼图游戏\\image\\animal\\animal2\\";
    //定义一个二维数组，用来存储正确的数据
    int[][] win={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };

    //定义变量，用来统计步数
    int step=0;

    //创建选项下面的条目对象。

    JMenuItem girl=new JMenuItem("美女");
    JMenuItem animal=new JMenuItem("动物");
    JMenuItem sport=new JMenuItem("运动");


    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");



    JMenuItem accountItem=new JMenuItem("微信");




    //规定GameJFrame表示这个游戏的主界面。

    public GameJFrame(){
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据,打乱的方式
        initData();


        //初始化图片
        initImage();


        //让界面显示出来,建议放到最后
        this.setVisible(true);
    }




    private void initData() {
        //定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //打乱数组的顺序
        //遍历数组，得到每一个数组，拿着每一个元素跟随机索引上的数据进行交换
        for (int i = 0; i < tempArr.length; i++) {
            //获取到随机索引
            Random r=new Random();
            int index = r.nextInt(tempArr.length);
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        //给二维数组添加数据
        //方法一：
        //遍历一维数组，把每一个元素依次添加到二维数组当中
        for (int i = 0; i < tempArr.length; i++) {
            if (tempArr[i]==0){
                x=i/4;
                y=i%4;
            }
            data[i/4][i%4] = tempArr[i];
        }
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
            }
        }


    }

    //初始化图片
    private void initImage() {

        //清空已经出现的照片
        this.getContentPane().removeAll();




        if (victory()){
            //显示胜利的图标
            JLabel winjLable=new JLabel(new ImageIcon("src\\java大项目\\a2拼图游戏\\image\\win.png"));
            winjLable.setBounds(203,283,197,73);
            this.getContentPane().add(winjLable);


        }


        JLabel stepCount=new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                //获取当前要加载图片的序号
                int num=data[i][j];
                JLabel jLabel=new JLabel(new ImageIcon(path+num+".jpg"));
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                //0表示让图片凸起来。
                //1表示让图片凹起来
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel);
            }
        }
        ImageIcon bg=new ImageIcon("src\\java大项目\\a2拼图游戏\\image\\background.png");

        JLabel background=new JLabel(bg);

        background.setBounds(40,40,508,560);
        //把背景图片添加到界面当中
        this.getContentPane().add(background);

        //刷新界面
        this.getContentPane().repaint();

    }


    public void initJMenuBar() {
        //初始化菜单
        //创建整个菜单对象
        JMenuBar jMenuBar=new JMenuBar();

        //创建菜单上面俩个选项的对象
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我");

        //再创建关于我们
        JMenu changeImage=new JMenu("更换图片");


        //将每一个选项下面的条目加入选项中
        changeImage.add(girl);
        changeImage.add(animal);
        changeImage.add(sport);

        functionJMenu.add(changeImage);
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);



        //给条目绑定事件
        girl.addActionListener(this);
        animal.addActionListener(this);
        sport.addActionListener(this);


        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);

        accountItem.addActionListener(this);



        //将菜单的俩个选项添加到菜单当中

        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    public void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版by_xiaou");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置游戏关闭模式
        //3就是常量WindowConstants.EXIT_ON_CLOSE
        this.setDefaultCloseOperation(3);

        //取消默认居中位置，只有取消了才会按照xy轴的形式添加组件
        this.setLayout(null);


        //添加键盘监听事件
        this.addKeyListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }



    //按下不松手时会调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code==65){
            //把界面中所有的图片删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
            JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon bg=new ImageIcon("src\\java大项目\\a2拼图游戏\\image\\background.png");

            JLabel background=new JLabel(bg);

            background.setBounds(40,40,508,560);
            //把背景图片添加到界面当中
            this.getContentPane().add(background);

            //刷新界面
            this.getContentPane().repaint();

        }
    }

    @Override
    public void keyReleased(KeyEvent e) {




        //判断游戏是否胜利，如果胜利，此方法需要立刻结束，不能执行下面的代码了。
        if (victory()){
            return;
        }



        //对上下左右进行判断
        //左，上，右，下分别是37 38 39 40
        int code = e.getKeyCode();
        if (code==37){
            if (y==3){
                return;
            }
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            initImage();
            step++;

        } else if (code == 38) {
            if (x==3){
                //表示空白方块已经在最下方了，他的下面没有图片再移动了
                return;
            }



            //逻辑：把空白方块下放的数字往上移动
            //把空白方块下方的数字往上移动
            //x,y表示空白方块
            //x+1,y表示空白方块下面的位置
            //进行交换
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;
            x++;//这个因为要重新记录0索引所在的位置
            //每调用一次就自增一次
            step++;


            //调用方法进行最新的加载
            initImage();


        }else if (code==39){
            if (y==0){
                return;
            }
            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            initImage();
            step++;
        }else if (code==40){
            if (x==0){
                return;
            }
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            initImage();
            step++;

        }else if (code==65){
            initImage();
        }else if (code==87){
            data=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            initImage();


        }





    }


    //判断data中数据是否和win数组相同
    public boolean victory(){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if (data[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        //判断
        if (obj == replayItem) {
            //计步器清0,要先清0
            step=0;
            //再次打乱数据
            initData();
            //重新加载图片
            initImage();

        } else if (obj == reLoginItem) {

            //关闭当前的游戏界面
            this.setVisible(false);

            //打开登录界面
            new LoginJFrame();

        } else if (obj == closeItem) {
            //直接关闭虚拟机即可
            System.exit(0);
        } else if (obj == accountItem) {
            //创建弹框对象
            JDialog jDialog=new JDialog();
            JLabel jLabel=new JLabel(new ImageIcon("src\\java大项目\\a2拼图游戏\\image\\about.jpg"));
            //设置位置和宽高
            jLabel.setBounds(0,0,1240,853);
            //添加到弹窗对象当中
            jDialog.getContentPane().add(jLabel);
            //给弹窗设置大小
            jDialog.setSize(1240,853);
            //弹窗置顶和居中
            jDialog.setAlwaysOnTop(true);
            jDialog.setLocationRelativeTo(null);
            //弹窗不关闭则无法  操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }else if (obj==girl||obj==animal||obj==sport){
            Random r=new Random();
            String pathflag;
            int index;
            if (obj==girl){
                index = r.nextInt(13) + 1;
                pathflag="girl";
            }else if (obj==animal){
               index = r.nextInt(8) + 1;
                pathflag="animal";
            }else{
                index = r.nextInt(10) + 1;
                pathflag="sport";
            }
            path="src\\java大项目\\a2拼图游戏\\image\\"+pathflag+"\\"+pathflag+index+"\\";

            initData();
            initImage();
        }
    }
}
